package com.mzy.linear_struct.ks;

/**
 * @Author: mizy3
 * @Date: 2024/08/26/上午10:52
 * @Description:
 */
public class Singleton {

    public volatile static Singleton INSTANCE;
    private Singleton() {
    }

    private static Singleton getInstance(){
        if(INSTANCE == null){
            synchronized (Singleton.class){
                if(INSTANCE == null){
                    // 这句命令不是原子操作
                    // 正常来说是：先通过构造方法获取堆中的地址，赋值为INSTANCE
                    // 但也有可能是：先赋值，这个时候就为null，然后调用构造方法
                    // 所以这里为了禁止指令重排序，必须加volatile
                    INSTANCE = new Singleton();

                    // 这行代码明明被synchronized包裹，正常来说不会发生指令重排序
                    // 但是外面的if没有被synchronized包裹，
                    // 它有可能获取的是没有执行完构造方法的对象
                }
            }
        }
        return INSTANCE;
    }

}
